# 一、什么是继承
"""
继承就是一个类，继承另外一个类的成员变量和成员方法
"""

# 二、单继承的语法与使用
"""
class 子类名(父类名):
    子类内容体

继承效果: 子类会继承(复制)父类的成员变量和成员方法。(注意: 不含父类私有成员)
"""
class A:
    IMEI = None # 手机序列号
    producer = "HM" # 手机厂商

    def call_by_4G(self):
        print("4G通话")

class B(A):
    face_id = True # 手机面部识别

    def call_by_5G(self):
        print("2022最新5G通话")


b = B()
b.call_by_4G()
b.call_by_5G()

# 三、多继承的语法与使用 + pass关键字
"""
class 子类(父类1, 父类2, ...):
    子类内容体
    
注意: 多个父类中, 如果有同名成员, 那么默认以继承顺序(从左到右)为优先级。
"""
class Phone:
    IMEI = None  # 手机序列号
    producer = "HM"  # 手机厂商

    def call_by_4G(self):
        print("4G通话")

class NFCReader:
    nfc_type = "第五代"
    producer = "HM"

    def read_card(self):
        print("NFC读卡")

    def write_card(self):
        print("NFC写卡")

class RemoteControl:
    rc_type = "红外遥控"

    def control(self):
        print("红外遥控开启")

class Myphone(Phone, NFCReader, RemoteControl):
    pass
"""
pass是一个空语句，用于表示一个占位符。当你需要一个语句，但又不想执行任何操作时，可以使用pass
"""

my_phone = Myphone()
my_phone.call_by_4G()
my_phone.read_card()
my_phone.write_card()
my_phone.control()

# 四、复写父类成员
"""
复写是指: 子类在继承父类的成员属性或成员方法后，如果对其不满意，那么可以进行复写。
即在子类中重新定义同名的属性或者方法即可
"""
class phone:
    IMEI = None # 序列号
    producer = "HM" # 厂商

    def call_by_5g(self):
        print("父类的5G通话")

class Myphone(phone):
    producer = "BIT" # 复写父类的成员属性

    def call_by_5g(self): # 复写父类的成员方法
        print("子类的5G通话")

p3 = Myphone()
print(p3.producer)
p3.call_by_5g()

"""
说明: 子类一旦复写父类成员, 那么子类类对象调用成员的时候，就会调用复写后的新成员
"""

# 子类如何调用父类的成员
"""
方法1:
调用父类成员变量: 父类名.成员变量
调用父类成员方法: 父类名.成员方法(self)

方法2:使用super()调用父类成员
调用父类成员变量: super().成员变量
调用父类成员方法: super().成员方法()
"""

class TestA:
    A = 3
    def printA(self):
        print("def printA(self):")

class TestB(TestA):
    def printB(self):

        TestA.printA(self)
        print(TestA.A)

        super().printA()
        print(super().A)

        print("def printB(self):")

b = TestB()
b.printB()